import type { RouteRecordRaw } from 'vue-router'
import { useRouteStore, useUserStore } from '@/stores'
import { getToken } from '@/utils/auth'
import NProgress from 'nprogress' // progress bar

import { createRouter, createWebHistory } from 'vue-router'
import { constantRoutes } from './constant'
import 'nprogress/nprogress.css'

NProgress.configure({ showSpinner: false }) // NProgress Configuration

// 自动导入全部静态路由,匹配 src/router/modules 目录（任何嵌套级别）中具有 .ts 扩展名的所有文件
const modules: Record<string, any> = import.meta.glob('./modules/**/*.ts', { eager: true })
const appRoutes: RouteRecordRaw[] = []
Object.keys(modules).forEach((key) => {
  appRoutes.push(modules[key].default)
})

const router = createRouter({
  history: createWebHistory(),
  // routes: constantRoutes,
  routes: constantRoutes.concat(appRoutes),
  scrollBehavior: () => ({ left: 0, top: 0 }),
})

router.beforeEach(async (to, from, next) => {
  const userStore = useUserStore()
  const routeStore = useRouteStore()
  // 匿名访问直接通过
  if (to.meta.anonymous) {
    return next()
  }
  // 未登录跳转登录页
  if (!getToken()) {
    const query = { from: encodeURIComponent(to.fullPath) }
    return next({ path: '/login', query })
  }
  // 已经登录，生成菜单
  if (!routeStore.initialized) {
    await routeStore.setupAppRoutes(appRoutes)
  }
  // 已经登录，则根据权限判断
  if (userStore.hasPermission(to.meta.code)) {
    return next()
  }
  // 否则，跳转403
  next({ path: '/403' })
  // // 判断该用户是否登录
  // if (getToken()) {
  //   // 已经登录再次访问登录页面，直接跳转到主页
  //   if (to.path === '/login') {
  //     return next('/')
  //   }
  //   if (!routeStore.initialized) {
  //     const accessAppRoutes = await routeStore.setupAppRoutes(appRoutes)
  //     accessAppRoutes.forEach(item => router.addRoute(item))
  //     return next({ ...to, replace: true })
  //   }

  //   return next()
  // } else if (to.meta.anonymous) {
  //   console.log('no token, anonymous: ', to, from)
  //   // 未登录但允许匿名访问，放行。如果没添加路由呢？
  //   // 逻辑有问题：没有添加路由，访问/home，会跳转到404，而不会跳转login后设置app路由，因为redirect路由不会经过beforeRouter
  //   return next()
  // } else {
  //   // 万一本身就是去login呢？
  //   // 未登录且不允许匿名访问，跳转登录页
  //   const query = { from: encodeURIComponent(to.fullPath) }
  //   return next({ path: '/login', query })
  // }
})

/**
 * @description 重置路由
 * @description 注意：所有动态路由路由必须带有 name 属性，否则可能会不能完全重置干净
 */
export function resetRouter() {
  try {
    const routeStore = useRouteStore()
    routeStore.appRoutes.forEach((route) => {
      const { name } = route
      if (name && router.hasRoute(name)) {
        router.removeRoute(name)
      }
    })
    router.replace('/login')
  } catch (error) {
    console.error(error)
    // 强制刷新浏览器也行，只是交互体验不是很好
    window.location.reload()
  }
}

export default router
